package cn.hdmis.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import cn.hdmis.bean.QueryResult;

/**
 * @author penwei
 * 
 */
public interface BaseDao<T> {
		/**
		 * 根据实体查找全部对象
		 * 
		 * @param entiey
		 *            实体（T类型）
		 * @return 根据属性查找对象
		 */
		public List<T> findAllEntity();

	   /**
		 * 根据属性查找对象
		 * 
		 * @param propertyName
		 *            属性（对应Bean）
		 * @param value
		 *            属性
		 * @return 根据属性查找对象
		 */
		public List<T> findByProperty(String propertyName, Object value);

		/**
		 * 根据实体查找对象
		 * 
		 * @param entiey
		 *            实体（T类型）
		 * @return 根据属性查找对象
		 */
		public List<T> findByEntity(Object entiey);

		/**
		 * 保存实体
		 * 
		 * @param entity
		 *            实体id
		 */
		public void save(T entity);
		/**
		 * 保存实体
		 * 
		 * @param entity
		 *            实体id
		 */
		public void saveOrUpdate(T entity);

		/**
		 * 更新实体
		 * 
		 * @param entity
		 *            实体id
		 */
		public void update(T entity);

		/**
		 * 删除实体
		 * 
		 * @param entityClass
		 *            实体类
		 * @param id
		 *            实体id数组
		 */
		public void delete(Serializable id);
		
		/**
		 * 删除实体
		 * 
		 * @param entityClass
		 *            实体类
		 * @param id
		 *            实体id数组
		 */
		public void deleteEntiey(T entity);
		
		
		/**
		 * 删除实体
		 * 
		 * @param entityClass
		 *            实体类
		 * @param id
		 *            实体id数组
		 */
		public void deleteList(List<Serializable> idList);
		/**
		 * 获取实体
		 * 
		 * @param <T>
		 * @param entityClass
		 *            实体类
		 * @param entityId
		 *            实体id
		 * @return
		 */
		public T findByID(Serializable entityId);

		/**
		 * 获取分页数据
		 * 
		 * @param firstindex
		 *            开始索引
		 * @param maxresult
		 *            每页显示记录数
		 * @param wherejpql
		 *            where语句
		 * @param queryParams
		 *            查询参数
		 * @param orderby
		 *            排序序列
		 * @return 分页数据
		 */
		public QueryResult<T> getScrollData(final int firstindex, final int maxresult, final String wherejpql, final Object[] queryParams,
				final List<String> orderby);
		/**
		 * 获取分页数据
		 * 
		 * @param firstindex
		 *            开始索引
		 * @param maxresult
		 *            每页显示记录数
		 * @param queryParamsMap
		 *            where字段
		 * @param orderby
		 *            排序序列
		 * @return 分页数据
		 */
		public QueryResult<T> getScrollData(final int firstindex, final int maxresult, final Map<String, Object> queryParamsMap,
				final List<String> orderby);
		/**
		 * 获取分页数据
		 * 
		 * @param firstindex
		 *            开始索引
		 * @param maxresult
		 *            每页显示记录数
		 * @param wherejpql
		 *            where语句
		 * @param queryParams
		 *            查询参数
		 * @return 分页数据
		 */
		public QueryResult<T> getScrollData(final int firstindex, final int maxresult, final String wherejpql, final Object[] queryParams);
		
		/**
		 * 获取分页数据
		 * 
		 * @param firstindex
		 *            开始索引
		 * @param maxresult
		 *            每页显示记录数
		 * @param wherejpql
		 *            where语句
		 * @param queryParams
		 *            查询参数
		 * @return 分页数据
		 */
		public QueryResult<T> getScrollData(final int firstindex, final int maxresult, final Map<String, Object> queryParamsMap);
		

		/**
		 * 获取分页数据
		 * 
		 * @param firstindex
		 *            开始索引
		 * @param maxresult
		 *            每页显示记录数
		 * @param orderby
		 *            排序序列
		 * @return 分页数据
		 */
		public QueryResult<T> getScrollData(final int firstindex, final int maxresult, final List<String> orderby);

		/**
		 * 获取分页数据
		 * 
		 * @param firstindex
		 *            开始索引
		 * @param maxresult
		 *            每页显示记录数
		 * @return 分页数据
		 */
		public QueryResult<T> getScrollData(final int firstindex, final int maxresult);

		/**
		 * 获取所有对象
		 * 
		 * @return 所有对象
		 */
		public QueryResult<T> getScrollData();
		
		public QueryResult<T> getScrollDataCriteria(final int firstindex, final int maxresult, final Map<String, Object> queryParamsMap,
				final List<String> orderby);

}
